# -*- coding: utf-8 -*-
from qt_core import *


class CircularProgress(QWidget):
    def __init__(
        self,
        progress_color,
        bg_color,
        text_color,
        value=0,
        progress_width=10,
        max_value=100,
        is_rounded=True,
        enable_text=True,
        font_family="Segoe UI",
        font_size=12,
        suffix="",
        prefix="",
        enable_bg=True,
    ):
        QWidget.__init__(self)

        # 初始化自定义属性
        self.value = value  # 当前进度值
        self.progress_width = progress_width  # 进度条宽度
        self.max_value = max_value  # 最大进度值
        self.progress_rounded_cap = is_rounded  # 是否启用圆角样式
        self.progress_color = progress_color  # 进度条颜色
        self.enable_text = enable_text  # 是否显示进度文本
        self.font_family = font_family  # 字体类型
        self.font_size = font_size  # 字体大小
        self.suffix = suffix  # 文本后缀（如%）
        self.prefix = prefix  # 文本前缀
        self.text_color = text_color  # 文本颜色
        self.enable_bg = enable_bg  # 是否启用背景圆环
        self.bg_color = bg_color  # 背景圆环颜色

    # 添加阴影效果
    def add_shadow(self, enable):
        """
        为控件添加阴影效果。
        :param enable: 是否启用阴影
        """
        if enable:
            self.shadow = QGraphicsDropShadowEffect(self)
            self.shadow.setBlurRadius(15)  # 设置模糊半径
            self.shadow.setXOffset(0)  # 水平偏移
            self.shadow.setYOffset(0)  # 垂直偏移
            self.shadow.setColor(QColor(0, 0, 0, 80))  # 设置阴影颜色
            self.setGraphicsEffect(self.shadow)

    # 设置进度值并触发重绘
    def set_value(self, value):
        """
        更新进度值并触发界面重绘。
        :param value: 新的进度值
        """
        self.value = value
        self.repaint()  # 触发重绘以更新进度条

    # 绘制事件：设计圆形进度条
    def paintEvent(self, event):
        """
        自定义绘制事件，用于绘制圆形进度条。
        包括背景圆环、进度圆环以及进度文本。
        """
        # 计算进度条参数
        progress_width = self.width() - self.progress_width  # 进度条实际宽度
        progress_height = self.height() - self.progress_width  # 进度条实际高度
        margin = self.progress_width / 2  # 边距，确保圆环居中
        progress_angle = self.value * 360 / self.max_value  # 当前进度对应的角度

        # 创建画笔对象
        painter = QPainter()
        painter.begin(self)
        painter.setRenderHint(QPainter.Antialiasing)  # 抗锯齿处理
        painter.setFont(QFont(self.font_family, self.font_size))  # 设置字体

        # 创建绘制区域
        rect = QRect(0, 0, self.width(), self.height())
        painter.setPen(Qt.NoPen)

        # 配置画笔
        pen = QPen()
        pen.setWidth(self.progress_width)
        if self.progress_rounded_cap:
            pen.setCapStyle(Qt.RoundCap)  # 设置圆角样式

        # 绘制背景圆环（如果启用）
        if self.enable_bg:
            pen.setColor(QColor(self.bg_color))
            painter.setPen(pen)
            painter.drawArc(margin, margin, progress_width, progress_height, 0, 360 * 16)

        # 绘制进度圆环
        pen.setColor(QColor(self.progress_color))
        painter.setPen(pen)
        painter.drawArc(margin, margin, progress_width, progress_height, -90 * 16, -progress_angle * 16)

        # 绘制文本（如果启用）
        if self.enable_text:
            pen.setColor(QColor(self.text_color))
            painter.setPen(pen)
            painter.drawText(
                rect, Qt.AlignCenter, f"{self.prefix}{self.value}{self.suffix}"
            )

        # 结束绘制
        painter.end()
